package common

import (
	"bufio"
	"fmt"
	"net"
	"strings"
	"sync"
)

type Client struct {
	Conn net.Conn
	Name string
}

type Server struct {
	Clients sync.Map // 使用 sync.Map 替代 map + Mutex
}

func (s *Server) AddClient(name string, conn net.Conn) bool {
	// 检查用户是否已存在
	if _, exist := s.Clients.Load(name); exist {
		conn.Write([]byte("用户已存在"))
		conn.Close()
		return false
	}

	fmt.Printf("%s进入聊天室。\n", name)
	client := &Client{
		Conn: conn,
		Name: name,
	}

	// 存储客户端
	s.Clients.Store(name, client)
	conn.Write([]byte("欢迎进入聊天室\n"))

	// 广播新用户加入
	s.Broadcast(fmt.Sprintf("%s 加入了聊天室", name), client)
	return true
}

func (s *Server) Broadcast(message string, client *Client) {
	s.Clients.Range(func(key, value interface{}) bool {
		client2 := value.(*Client)

		if client != nil && client2 == client {
			// 如果是用户本身，就跳过消息广播
			return true
		}

		_, err := client2.Conn.Write([]byte(message + "\n"))
		if err != nil {
			fmt.Printf("客户端 %s 发送消息失败。\n", client2.Name)
		}
		return true
	})
}

func (s *Server) ProcessClient(client *Client) {
	defer func() {
		// 广播离开消息
		s.Broadcast(fmt.Sprintf("%s 离开了聊天室", client.Name), nil)
		// 移除客户端
		s.RemoveClient(client)
	}()

	reader := bufio.NewReader(client.Conn)
	for {
		message, err := reader.ReadString('\n')
		if err != nil {
			// 正常断开连接
			return
		}
		content := strings.TrimSpace(message)
		// 如果输入 exit 则退出程序
		if content == "exit" {
			fmt.Printf("%s离开聊天室\n", client.Name)
			return
		}
		// 广播消息
		s.Broadcast(fmt.Sprintf("%s: %s", client.Name, content), client)
	}
}

func (s *Server) RemoveClient(client *Client) {
	s.Clients.Delete(client.Name)
	client.Conn.Close()
}

//package common
//
//import (
//	"bufio"
//	"fmt"
//	"net"
//	"strings"
//	"sync"
//)
//
//type Client struct {
//	Conn net.Conn
//	Name string
//}
//
//type Server struct {
//	Mutex   sync.Mutex
//	Clients map[string]*Client
//}
//
//func (s *Server) AddClient(name string, conn net.Conn) bool {
//	//添加用户前先添加锁
//	s.Mutex.Lock()
//	defer s.Mutex.Unlock()
//	_, exist := s.Clients[name]
//	for exist {
//		conn.Write([]byte("用户已存在"))
//		conn.Close()
//		return false
//	}
//	fmt.Printf("%s进入聊天室。\n", name)
//	client := &Client{
//		Conn: conn,
//		Name: name,
//	}
//	s.Clients[name] = client
//	conn.Write([]byte("欢迎进入聊天室\n"))
//	// 广播新用户加入，使用同一个锁
//	s.Broadcast(fmt.Sprintf("%s 加入了聊天室", name), client)
//	return true
//
//}
//
//func (s *Server) Broadcast(message string, client *Client) {
//	for _, client2 := range s.Clients {
//		if client != nil && client2 == client {
//			//如果是用户本身，就跳过消息广播
//			continue
//		}
//		_, err := client2.Conn.Write([]byte(message + "\n"))
//		if err != nil {
//			fmt.Printf("客户端 %s离开聊天室， 发送消息失败。\n", client.Name)
//		}
//	}
//}
//
//func (s *Server) ProcessClient(client *Client) {
//	defer func() {
//		//先管饱离开消息
//		s.Mutex.Lock()
//		s.Broadcast(fmt.Sprintf("%s 离开了聊天室", client.Name), nil)
//		s.Mutex.Unlock()
//		//移除客户吨
//		s.RemoveClient(client)
//	}()
//
//	reader := bufio.NewReader(client.Conn)
//	for {
//		message, err := reader.ReadString('\n')
//		if err != nil {
//			//正常断开连接
//			return
//		}
//		content := strings.TrimSpace(message)
//		//做一个判断，如果exit则就退出程序
//		if content == "exit" {
//			fmt.Printf("%s离开聊天室", client.Name)
//			return
//		}
//		//广播消息之前先获取锁
//		s.Mutex.Lock()
//		s.Broadcast(fmt.Sprintf("%s: %s", client.Name, content), client)
//		s.Mutex.Unlock()
//	}
//}
//
//func (s *Server) RemoveClient(client *Client) {
//	s.Mutex.Lock()
//	defer s.Mutex.Unlock()
//	if _, exists := s.Clients[client.Name]; exists {
//		delete(s.Clients, client.Name)
//		client.Conn.Close()
//	}
//}
